package com.itheima.backend.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;

public class JwtUtil {
    private static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    private static final long EXPIRATION_TIME = 1000 * 60 * 60; // 1小时

    public static String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(key)
                .compact();
    }

    public static Claims validateToken(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(key)
                .build()
                .parseClaimsJws(token)
                .getBody();
    }

    public static String getUsernameFromToken(String token) throws JwtException {
        return validateToken(token).get("username", String.class);
    }

    /**
     * 检查 JWT 是否过期
     * @param token JWT字符串
     * @return true 如果过期，false 如果未过期
     */
    public static boolean isTokenExpired(String token) {
        try {
            Date expiration = validateToken(token).getExpiration();
            return expiration.before(new Date());
        } catch (JwtException e) {
            return true; // 如果解析失败，视为已过期
        }
    }

}

//package com.itheima.backend.utils;
//
//import io.jsonwebtoken.*;
//import io.jsonwebtoken.security.Keys;
//import java.security.Key;
//import java.util.Date;
//
//public class JwtUtil {
//
//    private static final String SECRET_KEY = "your-secret-key"; // 替换为实际的密钥
//    private static final long EXPIRATION_TIME = 864_000_000; // 10天的过期时间
//
//    // 生成 token 时将 userId 和 username 都放入 JWT 中
//    public static String generateToken(Integer userId, String username) {
//        Date now = new Date();
//        Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME);
//
//        return Jwts.builder()
//                .setSubject(username)  // 将用户名放入 subject
//                .claim("userId", userId)  // 将 userId 作为自定义声明放入 JWT
//                .setIssuedAt(now)
//                .setExpiration(expiryDate)
//                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
//                .compact();
//    }
//
//    // 从 token 中解析出 username
//    public static String getUsernameFromToken(String token) {
//        Claims claims = Jwts.parser()
//                .setSigningKey(SECRET_KEY)
//                .parseClaimsJws(token)
//                .getBody();
//        return claims.getSubject(); // 获取 subject 中的 username
//    }
//
//    // 从 token 中解析出 userId
//    public static Integer getUserIdFromToken(String token) {
//        Claims claims = Jwts.parser()
//                .setSigningKey(SECRET_KEY)
//                .parseClaimsJws(token)
//                .getBody();
//        return claims.get("userId", Integer.class); // 获取自定义的 userId 声明
//    }
//
//    // 验证JWT并返回Claims
//    public static Claims validateToken(String token) throws Exception {
//        try {
//            // 使用密钥解析JWT并获取其中的claims
//            Claims claims = Jwts.parser()
//                    .setSigningKey(SECRET_KEY)  // 设置密钥进行验证
//                    .parseClaimsJws(token)  // 解析token
//                    .getBody();  // 获取token中的body部分（包含claims）
//
//            return claims;
//        } catch (Exception e) {
//            // 如果token无效或过期，抛出异常
//            throw new Exception("Invalid token");
//        }
//    }
//}
